package com.jackstraw.commoncode.utils;

import com.jackstraw.commoncode.exception.SystemException;
import com.jackstraw.commoncode.pojo.ErrorInfo;

/**
 * 所在包：com.jackstraw.exception.utils
 * 文件名： 异常信息处理工具类
 * 版权：jackstraw.
 * 项目：exception
 * 功能描述：
 * 修改人：稻草人
 * 修改时间：2022-04-02 15:25
 */
public class ErrorMsgUtil {

    /**
     * 未捕获异常默认提示信息
     */
    private static final String DEFAULT_GLOBAL_SYSTEM_ERROR_MSG = "系统异常";

    /**
     * 获取异常信息
     * @param e
     * @return
     */
    public static ErrorInfo getErrorInfo(Exception e) {
        String errorCode = CodeUtil.getErrorCode();
        String errorTipMsg = null;
        String errorLogMsg = null;
        String latestErrorMsg = null;
        String customErrorMsg = null;
        String origErrorMsg = null;
        if (e instanceof SystemException) {
            SystemException systemException = (SystemException) e;
            latestErrorMsg = systemException.getLatestErrorMsg();
            customErrorMsg = systemException.getCustomErrorMsg();
            origErrorMsg = systemException.getOrigErrorMsg();
            errorTipMsg = createErrorTipMsg(latestErrorMsg, errorCode);
            errorLogMsg = createErrorLogMsg(customErrorMsg, origErrorMsg, errorCode);
        } else {
            errorTipMsg = createErrorTipMsg(DEFAULT_GLOBAL_SYSTEM_ERROR_MSG, errorCode);
            errorLogMsg = createErrorLogMsg(errorTipMsg, e.getMessage(), errorCode);
        }

        // 封装返回对象
        ErrorInfo errorInfo = new ErrorInfo();
        errorInfo.setErrorCode(errorCode);
        errorInfo.setCustomErrorMsg(customErrorMsg);
        errorInfo.setLatestErrorMsg(latestErrorMsg);
        errorInfo.setOrigErrorMsg(origErrorMsg);
        errorInfo.setErrorLogMsg(errorLogMsg);
        errorInfo.setErrorTipMsg(errorTipMsg);
        return errorInfo;
    }

    /**
     * 生成用户提示异常信息
     * @param errorMsg 自定义异常提示信息
     * @param errorCode 异常编码
     * @return
     */
    private static String createErrorTipMsg(String errorMsg, String errorCode) {
        return errorMsg + "(" + errorCode + ")";
    }

    /**
     * 生成日志记录错误信息
     * @param customErrorMsg 自定义异常日志描述
     * @param origErrorMsg 系统异常日志描述
     * @param errorCode 异常编码
     */
    private static String createErrorLogMsg(String customErrorMsg, String origErrorMsg, String errorCode) {
        StringBuffer logErrorMsgBuffer = new StringBuffer();
        logErrorMsgBuffer.append(System.lineSeparator());
        logErrorMsgBuffer.append("-----------------------------------------------------------------").append(System.lineSeparator());
        logErrorMsgBuffer.append("异常编码 : ").append(System.lineSeparator());
        logErrorMsgBuffer.append("    " + errorCode).append(System.lineSeparator());
        logErrorMsgBuffer.append("自定义异常描述：").append(System.lineSeparator());
        logErrorMsgBuffer.append(customErrorMsg).append(System.lineSeparator());
        logErrorMsgBuffer.append("系统异常描述：").append(System.lineSeparator());
        logErrorMsgBuffer.append(origErrorMsg).append(System.lineSeparator());
        logErrorMsgBuffer.append("-----------------------------------------------------------------").append(System.lineSeparator());
        return logErrorMsgBuffer.toString();
    }
}
